#include <iostream>
#include <algorithm>

using namespace std;

const int N = 20;

int n, w;
int c[N]; // 小猫的信息

int cnt; // 当前用了多少车
int s[N]; // 每一辆车目前的总重

int ret = N; // 最优解

bool cmp(int a, int b)
{
	return  a > b;
}

//安排第几只小猫
void dfs(int pos)
{
	//策略二：最优性剪枝
	if(cnt >= ret) return;

	//n只小猫已经安排完了，更新结果
	if(pos > n)
	{
		ret = cnt;
		return;
	}

	//策略三：优化搜索顺序
	//1）先考虑安排在已有的车辆上
	for(int i = 1; i <= cnt; i++)
	{
		//策略一：可行性剪枝
		if(s[i] + c[pos] > w) continue;
		s[i] += c[pos];
		dfs(pos + 1);
		s[i] -= c[pos]; // 恢复现场
	}

	//2）再考虑重开一辆车
	cnt++;
	s[cnt] = c[pos];
	dfs(pos + 1);
	//恢复现场，注意顺序
	s[cnt] = 0;
	cnt--;
}

int main()
{
	cin >> n >> w;
	for(int i = 1; i <= n; i++) cin >> c[i];

	//优化三：优化搜索顺序
	sort(c + 1, c + 1 + n, cmp);

	dfs(1);

	cout << ret << endl;

	return 0;
}